#include <string>
#include <sstream>
#include "node.h"
#include "basetype.h"

namespace AST {

    // Construtor
    Basetype::Basetype(std::string* content) {
        // Configuração
        this->_setContent(content)->setDimensions(0);
    };

    // Configura o Conteúdo Capturado pelo Token
    Basetype* Basetype::_setContent(std::string* content) {
        // Configuração
        this->_content = content;
        // Encadeamento
        return this;
    };

    // Apresenta o Conteúdo Capturado pelo Token
    std::string* Basetype::getContent() {
        // Apresentação
        return this->_content;
    };

    // Configura a Quantidade de Dimensões
    Basetype* Basetype::setDimensions(unsigned int dimensions) {
        // Configuração
        this->_dimensions = dimensions;
        // Encadeamento
        return this;
    };

    // Captura de Quantidade de Dimensões
    unsigned int Basetype::getDimensions() {
        // Apresentação
        return this->_dimensions;
    };

    // Inclusão de Dimensões na Tipagem
    Basetype* Basetype::addDimensions(int dimensions) {
        // Cálculo de Dimensões
        dimensions = this->getDimensions() + dimensions;
        // Configuração
        this->setDimensions(dimensions);
        // Encadeamento
        return this;
    };

    // Sobrescrita
    std::string Basetype::toString(int indent) {
        // Conversão de Dimensões
        std::string dimensions;
        std::stringstream out;
        out << this->getDimensions();
        dimensions = out.str();
        // Apresentação
        return this->getIndentSpaces(indent)
            + "Basetype '" + (*this->getContent()) + "'\n"
            + this->getIndentSpaces(indent + 1) + "Dimensions '" + dimensions + "'";
    };

};

